// src/utils/logger.hpp
#pragma once

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <memory>

class Logger {
public:
    static void init(const std::string& filename) {
        try {
            // 创建控制台sink和文件sink
            auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
            auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(filename, true);

            // 设置日志格式
            // %Y-%m-%d %H:%M:%S.%e 时间戳
            // [%^%l%$] 带颜色的日志级别
            // [%t] 线程ID
            // %v 实际的日志消息
            const std::string pattern = "[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [%t] %v";
            console_sink->set_pattern(pattern);
            file_sink->set_pattern(pattern);

            // 创建多sink的logger
            logger_ = std::make_shared<spdlog::logger>("server", 
                spdlog::sinks_init_list{console_sink, file_sink});

            // 设置全局日志级别
            logger_->set_level(spdlog::level::debug);
            
            // 设置为全局默认logger
            spdlog::set_default_logger(logger_);

            logger_->info("Logger initialized successfully");
        }
        catch (const spdlog::spdlog_ex& ex) {
            std::cerr << "Log initialization failed: " << ex.what() << std::endl;
            throw;
        }
    }

    // 支持格式化字符串的日志方法
    template<typename... Args>
    static void debug(fmt::format_string<Args...> fmt, Args&&... args) {
        logger_->debug(fmt, std::forward<Args>(args)...);
    }

    template<typename... Args>
    static void info(fmt::format_string<Args...> fmt, Args&&... args) {
        logger_->info(fmt, std::forward<Args>(args)...);
    }

    template<typename... Args>
    static void warning(fmt::format_string<Args...> fmt, Args&&... args) {
        logger_->warn(fmt, std::forward<Args>(args)...);
    }

    template<typename... Args>
    static void error(fmt::format_string<Args...> fmt, Args&&... args) {
        logger_->error(fmt, std::forward<Args>(args)...);
    }

    template<typename... Args>
    static void critical(fmt::format_string<Args...> fmt, Args&&... args) {
        logger_->critical(fmt, std::forward<Args>(args)...);
    }

    // 获取原始logger实例
    static std::shared_ptr<spdlog::logger>& get() {
        return logger_;
    }

private:
    static std::shared_ptr<spdlog::logger> logger_;
};

// 定义静态成员变量
std::shared_ptr<spdlog::logger> Logger::logger_;